///*
// * To change this template, choose Tools | Templates
// * and open the template in the editor.
// */
//package linkeddata.arida.ufc.br.manager.impl;
//
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.LinkedHashSet;
//import java.util.LinkedList;
//import java.util.Map;
//import java.util.Set;
//import linkeddata.arida.ufc.br.enums.ClausesSparql;
//import linkeddata.arida.ufc.br.manager.SparqlQuery;
//import linkeddata.arida.ufc.br.search.HierarchyOfClasses;
//import linkeddata.arida.ufc.br.util.TripleStore;
//import org.semanticweb.owlapi.model.OWLEntity;
//import org.semanticweb.owlapi.model.OWLOntology;
//import org.semanticweb.owlapi.model.OWLOntologyCreationException;
//import org.semanticweb.owlapi.reasoner.OWLReasoner;
//import org.semanticweb.owlapi.util.DefaultPrefixManager;
//
///**
// *
// * @author jeovane
// */
//public class BuildsSparqlQuery_2 extends BuildsHierarchyDataProperty implements SparqlQuery {
//
//    private HierarchyOfClasses hoc = new HierarchyOfClasses();
//    private LinkedList<String> linkValues = new LinkedList<String>();
//    private Set<String> setValues = new LinkedHashSet<String>();
//
//    @Override
//    public void buildsHeadQuery() {
////        query = "PREFIX dailymed: <http://www4.wiwiss.fu-berlin.de/dailymed/resource/dailymed/>"
////                + "\n" + "PREFIX drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>"
////                + "\n" + "PREFIX sider: <http://www4.wiwiss.fu-berlin.de/sider/resource/sider/> \n";
//    }
//
//    @Override
//    public String buildsSelect(Map<String, Set<String>> mapTeste, String activeUnion, OWLOntology ontology, DefaultPrefixManager pm, OWLReasoner reasoner) throws OWLOntologyCreationException {
//
//        setQuery("PREFIX dailymed: <http://www4.wiwiss.fu-berlin.de/dailymed/resource/dailymed/>"
//                + "\n" + "PREFIX drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>"
//                + "\n" + "PREFIX sider: <http://www4.wiwiss.fu-berlin.de/sider/resource/sider/>\n\n");
//
//        // Adiciona a cláusula SELECT na consulta
//        setQuery(getQuery() + "" + ClausesSparql.SELECT.toString());
//        
//        for (String keys : classHierarchyKey(mapTeste, ontology, reasoner, pm)) {
//            setArrayKeysMap(keys);
//            System.out.println(keys);
//            setValues = mapTeste.get(keys);
//            System.out.println(setValues);
//            for (String value : setValues) {
//                for (Iterator itBH = buildsHierarchy(ontology).entrySet().iterator(); itBH.hasNext();) {
//                    Map.Entry entryBH = (Map.Entry) itBH.next();
//                    String key = pm.getShortForm((OWLEntity) entryBH.getKey()).replace(":", "");
//                    ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entryBH.getValue();
//                    for (OWLEntity owlEntity : arrayValues) {
//                        String valueKey = pm.getShortForm(owlEntity).replace(":", "");
//                        if (key.equalsIgnoreCase(keys) && valueKey.equalsIgnoreCase(value)) {
//                            setSetSelect(" ?" + key + "_" + valueKey);
//                        }
//                    }
//                }
//            }
//        }
//
//        for (String varSelect : getSetSelect()) {
//            setQuery(getQuery() + "" + varSelect);
//        }
//        return getQuery();
//    }
//
//    @Override
//    public String buildsWhere(Map<String, Set<String>> mapTeste, Set<String> setOpt, Set<String> setFilter, OWLOntology ontology, DefaultPrefixManager pm, OWLReasoner reasoner) throws OWLOntologyCreationException {
//        // Adiciona a cláusula WHERE na consulta
//        setQuery(getQuery() + " " + "\n" + ClausesSparql.WHERE.toString() + " {");
//
//        setPrefix("ddg");
//
//        if (!setOpt.isEmpty()) {
//            buildsOptional(setOpt);
//        }
//
//        for (String keys : classHierarchyKey(mapTeste, ontology, reasoner, pm)) {
//            setArrayObjectDomain(keys);
//            setValues = mapTeste.get(keys);
//            for (String value : setValues) {
//                for (Iterator itBH = buildsHierarchy(ontology).entrySet().iterator(); itBH.hasNext();) {
//                    Map.Entry entryBH = (Map.Entry) itBH.next();
//                    String key = pm.getShortForm((OWLEntity) entryBH.getKey()).replace(":", "");
//                    ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entryBH.getValue();
//                    for (OWLEntity owlEntity : arrayValues) {
//                        String valueKey = pm.getShortForm(owlEntity).replace(":", "");
//                        if (key.equalsIgnoreCase(keys) && valueKey.equalsIgnoreCase(value)) {
//                            if (getArrayObjectDomain().get(0).equalsIgnoreCase(key)) {
//                                // Adiciona o OPTIONAL ao Set. Adiante terá os seus valores repassados para a variável query
//                                if (buildsOptional(setOpt).contains(key)) {
//                                    setSetOptional("\n  " + ClausesSparql.OPT.toString()
//                                            + " { ?" + key + " "
//                                            + getPrefix() + ":" + valueKey
//                                            + " ?" + key + "_" + valueKey + " }.");
//                                } else {
//                                    setSetWhere("\n  ?" + key + " "
//                                            + getPrefix() + ":" + valueKey
//                                            + " ?" + key + "_" + valueKey + ".");
//                                }
//                            } else {
//                                // Adiciona o OPTIONAL ao Set. Adiante terá os seus valores repassados para a variável query
//                                if (buildsOptional(setOpt).contains(key)) {
//                                    setSetOptional("\n  " + ClausesSparql.OPT.toString()
//                                            + " { ?" + getArrayObjectDomain().get(0) + " "
//                                            + getPrefix() + ":" + valueKey
//                                            + " ?" + key + "_" + valueKey + " }.");
//                                } else {
//                                    // System.out.println(arrayObjectDomain.get(0));
//                                    setSetWhere("\n  ?" + getArrayObjectDomain().get(0) + " "
//                                            + getPrefix() + ":" + valueKey
//                                            + " ?" + key + "_" + valueKey + ".");
//                                }
//                            }
//                        }
//                    }
//                }
//
//                for (int i = 0; i < getArrayKeysMap().size(); i++) {
//                    for (int j = i + 1; j < getArrayKeysMap().size(); j++) {
//                        for (Iterator itObjProp = buildsObjectProperty(ontology, reasoner, pm).iterator(); itObjProp.hasNext();) {
//                            setTs((TripleStore) itObjProp.next());
//                            if (getArrayKeysMap().get(i).equalsIgnoreCase(getTs().getDomain()) && getArrayKeysMap().get(j).equalsIgnoreCase(getTs().getRange())) {
//                                isRange(getTs().getDomain(), getTs().getRange());
//                                // Verifica se uma classe é Domain e Range
//                                if (isRange().equalsIgnoreCase(getTs().getDomain())) {
//
//                                    //System.out.println(getTs().getObjectProperty());
//
//                                    setSetWhere("\n  ?" + getTs().getDomain() + "_" + findDomain() + " "
//                                            + getPrefix() + ":" + getTs().getObjectProperty()
//                                            + " ?" + getTs().getRange() + "_" + getTs().getDomain() + ".");
//                                } else {
//                                    setSetWhere("\n  ?" + getTs().getDomain() + " "
//                                            + getPrefix() + ":" + getTs().getObjectProperty()
//                                            + " ?" + getTs().getRange() + "_" + getTs().getDomain() + ".");
//                                }
//                                getArrayObjectDomain().add(getTs().getRange() + "_" + getTs().getDomain());
//                            }
//                        }
//                    }
//                }
//            }
//            getArrayObjectDomain().remove(getArrayObjectDomain().get(0));
//        }
//
//        // Adiciona as triplas do WHERE na consulta
//        for (String varWhere : getSetWhere()) {
//            setQuery(getQuery() + " " + varWhere);
//        }
//
//        // Adiciona o FILTER a consulta
//        if (!setFilter.isEmpty()) {
//            for (String varFilter : setFilter) {
//                setQuery(getQuery() + " " + "\n  " + ClausesSparql.FILTER.toString() + " { " + varFilter + " }.");
//            }
//        }
//
//        // Adiciona o OPTIONAL a consulta
//        if (!getSetOptional().isEmpty()) {
//            for (String varOpcional : getSetOptional()) {
//                setQuery(getQuery() + " " + varOpcional);
//            }
//        }
//        setQuery(getQuery() + " " + "\n}");
//        return getQuery();
//    }
//
//    @Override
//    // I-N-C-O-M-P-L-E-T-O (FAIL)
//    public String buildsSelectUnion(Map<String, Set<String>> mapDatatype) {
//        // Adiciona a cláusula SELECT na consulta
//        queryUnion = "WHERE { \n" + "   { "
//                + ClausesSparql.SERVICE.toString() + " <> { \n"
//                + "      " + ClausesSparql.SELECT.toString();
//
//        for (Iterator it = mapDatatype.entrySet().iterator(); it.hasNext();) {
//            Map.Entry entry = (Map.Entry) it.next();
//            String keys = (String) entry.getKey();
//            setArrayKeysMap(keys);
//            Set<String> values = (Set<String>) entry.getValue();
//            for (String value : values) {
//                for (Iterator itBH = buildsHierarchy(getOntology()).entrySet().iterator(); itBH.hasNext();) {
//                    Map.Entry entryBH = (Map.Entry) itBH.next();
//                    String key = getPm().getShortForm((OWLEntity) entryBH.getKey()).replace(":", "");
//                    ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entryBH.getValue();
//                    if (key.equalsIgnoreCase(keys)) {
//                        for (OWLEntity owlEntity : arrayValues) {
//                            String valueKey = getPm().getShortForm(owlEntity).replace(":", "");
//                            if (valueKey.equalsIgnoreCase(value)) {
//                                queryUnion += " ?" + key + "_" + valueKey;
//                            }
//                        }
//                    }
//                }
//            }
//        }
//
//        return queryUnion;
//    }
//
//    @Override
//    // I-N-C-O-M-P-L-E-T-O (FAIL)
//    public Set<String> buildsWhereUnion(Map<String, Set<String>> mapDatatype) {
//        queryUnion = "WHERE { \n" + "   { "
//                + ClausesSparql.SERVICE.toString() + " <> { \n"
//                + "      " + ClausesSparql.SELECT.toString();
//
//        for (Iterator it = mapDatatype.entrySet().iterator(); it.hasNext();) {
//            Map.Entry entry = (Map.Entry) it.next();
//            String keys = (String) entry.getKey();
//            //arrayObjectDomain.add(keys);
//            Set<String> values = (Set<String>) entry.getValue();
//            for (String value : values) {
//                //setWhereUnion = new LinkedHashSet<>();
//                for (Iterator itBH = buildsHierarchy(getOntology()).entrySet().iterator(); itBH.hasNext();) {
//                    Map.Entry entryBH = (Map.Entry) itBH.next();
//                    String key = getPm().getShortForm((OWLEntity) entryBH.getKey()).replace(":", "");
//                    ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entryBH.getValue();
//                    if (key.equalsIgnoreCase(keys)) {
//                        for (OWLEntity owlEntity : arrayValues) {
//                            String valueKey = getPm().getShortForm(owlEntity).replace(":", "");
//                            if (valueKey.equalsIgnoreCase(value)) {
//                                queryUnion += " ?" + key + "_" + valueKey
//                                        + "\n         ?" + key + " "
//                                        + getPrefix() + ":" + valueKey
//                                        + " ?" + key + "_" + valueKey + ".";
//
//                                setWhereUnion.add(queryUnion);
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        return setWhereUnion;
//    }
//
//    private ArrayList<String> isRange(String domain, String range) {
//        setSetDomain(domain);
//        setArrayRange(range);
//
//        for (String srtDomain : getSetDomain()) {
//            for (String srtRange : getArrayRange()) {
//                if (srtRange.equalsIgnoreCase(srtDomain)) {
//                    setArrayIsRange(srtDomain);
//                }
//            }
//        }
//        return getArrayIsRange();
//    }
//
//    // Verifica se a classe é Range
//    private String isRange() {
//        String domain = "";
//        for (String strDomain : getArrayIsRange()) {
//            domain = strDomain;
//        }
//        return domain;
//    }
//
//    // Encontra o Domain pra um determinado Range
//    private String findDomain() {
//        String domain = "";
//        for (String srtDomain : getSetDomain()) {
//            if (!isRange().equalsIgnoreCase(srtDomain)) {
//                domain = srtDomain;
//            }
//        }
//        return domain;
//    }
//
//    // Obtém as classes que foram selecionadas como OPTIONAL
//    private ArrayList<String> buildsOptional(Set<String> setOpt) {
//        ArrayList<String> arrayOpt = new ArrayList<String>();
//        if (!setOpt.isEmpty()) {
//            for (String opt : setOpt) {
//                for (String keys : getArrayKeysMap()) {
//                    if (opt.equalsIgnoreCase(keys)) {
//                        arrayOpt.add(opt);
//                    }
//                }
//            }
//        }
//        return arrayOpt;
//    }
//
//    // Ordena as classes de acordo com a hierarquia da Ontologia
////    private Set<String> classHierarchyKey(String jsonText, OWLOntology ontology, OWLReasoner reasoner, DefaultPrefixManager pm) {
////        Set<String> setKeys = new LinkedHashSet<String>();
////        Set<String> jsonKeys = new LinkedHashSet<String>();
////        
////        for (Iterator it = BuildsMapJson.JSONMap(jsonText).entrySet().iterator(); it.hasNext();){
////            Map.Entry entry = (Map.Entry) it.next();
////             String key = (String) entry.getKey();
////             jsonKeys.add(key);
////        }
////        
////        for (String node : hoc.CorrectHierarchyOfClasses(ontology, reasoner, pm)) {
////            for (String mapKey : jsonKeys) {
////                if (node.contains(mapKey)) {
////                    setKeys.add(node);
////                }
////            }
////        }
////        
////        return setKeys;
////    }
//    private Set<String> classHierarchyKey(Map<String, Set<String>> mapTeste, OWLOntology ontology, OWLReasoner reasoner, DefaultPrefixManager pm) {
//        Set<String> setKeys = new LinkedHashSet<String>();
//
//        //System.out.println("mapTeste.keySet(): " + mapTeste.keySet());
//        for (String node : hoc.CorrectHierarchyOfClasses(ontology, reasoner, pm)) {
//            for (String mapKey : mapTeste.keySet()) {
//                if (mapKey.contains(node)) {
//                    System.out.println("node: " + node);
//                    setKeys.add(node);
//                }
//            }
//        }
//        return setKeys;
//    }
//
//    // Obtém os valores que estão no Map
//    private Set<String> classHierarchyValue(Map<String, Set<String>> mapDatatype) {
//        Set<String> setValues = null;
//        for (Iterator it = mapDatatype.entrySet().iterator(); it.hasNext();) {
//            Map.Entry entry = (Map.Entry) it.next();
//            setValues = (Set<String>) entry.getValue();
//        }
//        return setValues;
//    }
//
//    @Override
//    public void buildsSelectRasc(String nameClass, String nameDataProperties, ArrayList<String> arrayUnion) throws OWLOntologyCreationException {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public ArrayList<String> buildsWhereRasc(ArrayList<String> arrayWhere) throws OWLOntologyCreationException {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public void buildsSelectUnionRasc(ArrayList<String> arrayUnion) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public void buildsWhereUnionRasc(ArrayList<String> arrayWhere) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//}
